"""
文件操作模块

职责:
- 处理Excel文件的读写操作
- 管理文件对话框交互
- 提供文件I/O接口
"""

import os
from openpyxl import load_workbook, Workbook
from tkinter import filedialog, messagebox


class FileHandler:
    """文件处理器"""
    
    @staticmethod
    def load_excel_file(file_path):
        """
        加载Excel文件
        
        参数:
            file_path (str): Excel文件路径
            
        返回:
            tuple: (workbook, sheet_names) 或 (None, []) 如果加载失败
        """
        try:
            workbook = load_workbook(file_path)
            sheet_names = workbook.sheetnames
            return workbook, sheet_names
        except Exception as e:
            messagebox.showerror("错误", f"加载文件失败:\n{str(e)}")
            return None, []
    
    @staticmethod
    def read_sheet_data(worksheet):
        """
        读取工作表的配置数据
        
        参数:
            worksheet: openpyxl工作表对象
            
        返回:
            list: 配置数据列表，每项为 {name: str, value: str}
        """
        config_list = []
        
        # 从第2行开始读取数据（跳过标题行）
        for row_idx, row in enumerate(worksheet.iter_rows(min_row=2, values_only=False), 2):
            name_cell = row[0]
            value_cell = row[1] if len(row) > 1 else None
            
            if name_cell and name_cell.value:
                name = str(name_cell.value)
                value = str(value_cell.value) if value_cell and value_cell.value else ""
                config_list.append({"name": name, "value": value})
        
        return config_list
    
    @staticmethod
    def save_excel_file(file_path, sheets_data):
        """
        保存配置数据到Excel文件
        
        参数:
            file_path (str): 保存的文件路径
            sheets_data (dict): 工作表数据，格式: {sheet_name: [{name: str, value: str}, ...]}
            
        返回:
            bool: 保存成功返回True，失败返回False
        """
        try:
            workbook = Workbook()
            workbook.remove(workbook.active)  # 删除默认工作表
            
            for sheet_name, config_list in sheets_data.items():
                ws = workbook.create_sheet(sheet_name)
                
                # 添加标题行
                ws['A1'] = '名称'
                ws['B1'] = '值'
                
                # 添加数据行
                for row_idx, config_item in enumerate(config_list, 2):
                    ws[f'A{row_idx}'] = config_item['name']
                    ws[f'B{row_idx}'] = str(config_item['value'])
            
            workbook.save(file_path)
            messagebox.showinfo("成功", f"配置已保存到:\n{file_path}")
            return True
            
        except Exception as e:
            messagebox.showerror("错误", f"保存文件失败:\n{str(e)}")
            return False
    
    @staticmethod
    def get_save_file_path(default_extension=".xlsx"):
        """
        打开保存文件对话框
        
        参数:
            default_extension (str): 默认文件扩展名
            
        返回:
            str: 选择的文件路径，或空字符串如果用户取消
        """
        file_path = filedialog.asksaveasfilename(
            defaultextension=default_extension,
            filetypes=[("Excel文件", "*.xlsx"), ("所有文件", "*.*")],
            title="保存配置文件"
        )
        return file_path
    
    @staticmethod
    def get_open_file_path():
        """
        打开打开文件对话框
        
        返回:
            str: 选择的文件路径，或空字符串如果用户取消
        """
        file_path = filedialog.askopenfilename(
            filetypes=[("Excel文件", "*.xlsx"), ("Excel文件", "*.xls"), ("所有文件", "*.*")],
            title="加载配置文件"
        )
        return file_path
    
    @staticmethod
    def get_directory_path():
        """
        打开目录选择对话框
        
        返回:
            str: 选择的目录路径，或空字符串如果用户取消
        """
        dir_path = filedialog.askdirectory(title="选择保存头文件的目录")
        return dir_path
    
    @staticmethod
    def file_exists(file_path):
        """
        检查文件是否存在
        
        参数:
            file_path (str): 文件路径
            
        返回:
            bool: 文件存在返回True
        """
        return os.path.exists(file_path)
    
    @staticmethod
    def write_file(file_path, content, encoding="utf-8"):
        """
        写入文件内容
        
        参数:
            file_path (str): 文件路径
            content (str): 文件内容
            encoding (str): 编码方式
            
        返回:
            bool: 写入成功返回True
        """
        try:
            with open(file_path, "w", encoding=encoding) as f:
                f.write(content)
            return True
        except Exception as e:
            messagebox.showerror("错误", f"写入文件失败:\n{str(e)}")
            return False
